package com.fhz.loginmvvm.room

import android.content.Context
import androidx.annotation.NonNull
import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase
import androidx.room.migration.Migration
import androidx.sqlite.db.SupportSQLiteDatabase
import com.fhz.loginmvvm.Data
import com.fhz.loginmvvm.User

/**
 * 时间:2023/3/28
 * @author Mr.Feng
 * 简述:  * 简述: 记住每次更改实体类的时候.
 * 1,更改 版本号.
 * 2,更改entities中的class
 * 3, 添加Dao
 * 4, 在创建数据的方发时调用Migration 方法.
 *
 *  以上是保留源数据的升级操作.
 *  如果是测试数据,可以直接调用 fallbackToDestructiveMigration()
 *  此方法是删除所有数据,从新创建表.不保留数据.
 */

@Database(entities = [Data::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
    abstract fun dataDao(): DataDao

//    companion object{
//        val MIGRATION_2_3: Migration = object : Migration(2,3) {
//            override fun migrate(@NonNull database: SupportSQLiteDatabase) {
//                //执行升级相关操作
//                //删除表
////                    database.execSQL("drop table `student` ")
//                //添加一个新类,也就是一个新表的时候的操作.记住要和实体类的类型一样.
////                    database.execSQL("CREATE TABLE `student` (`uid` INTEGER, " +
////                        "`sName` TEXT, " +
////                        "`sAddress` TEXT," +
////                        "PRIMARY KEY(`uid`))")
//                //跟现在的表添加一个字段
////                database.execSQL("ALTER TABLE user ADD COLUMN address TEXT")
//
//            }
//        }
//    }

    //伴生对象 -> stastc
    companion object{
        private var instant: AppDatabase? = null
        @Synchronized
        fun getDatabase(context: Context):AppDatabase{
                instant?.let {
                return it
            }

            return Room.databaseBuilder(context.applicationContext,AppDatabase::class.java,"app_database")
                .allowMainThreadQueries()
//                .fallbackToDestructiveMigration() //删除所有库,重新创建, 如果不这么做.要写sql语句升级
                .build().apply {
                    instant = this
                }
        }
    }
}
